﻿Imports Persistencia
Imports DSControlePadrao
Public Class ctrImposto
    Inherits ctrPadrao

#Region "Enumerações"

    Public Enum eModalidadeVenda
        CONSUMO_PROPRIO = 0
        INDUSTRIALIZACAO = 1
    End Enum

#End Region

#Region "Variáveis de classe"

    Private objImposto As New perImposto
    Private datFator As New DataTable

    Private Const PIS_COFINS As Decimal = 9.25
#End Region

    Sub New()

        datFator = Me.selecionarFator(0, 0)

    End Sub

    Public ReadOnly Property Perc_PIS_COFINS As Decimal
        Get
            Return PIS_COFINS
        End Get
    End Property

    Public Function selecionarFator(ByVal dICMS As Decimal, ByVal dIPI As Decimal) As DataTable

        Try

            Return objImposto.selecionarFator(dICMS, dIPI)

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao selecionar os fatores de cálculo. " & _
                                    Environment.NewLine & ex.Message)


        End Try

    End Function

    Public Function retornaValorICMSEstado(ByVal sEstado As String) As Decimal
        Try
            Return Me.objImposto.retornaValorICMSEstado(sEstado)
        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao retornar ICMS por estado. " & _
                                    Environment.NewLine & ex.Message)


        End Try
    End Function

    Public Function calcularValorImposto(ByVal iModalidadeVenda As eModalidadeVenda,
                                         ByVal dValorItem As Decimal,
                                         ByVal dICMS As Decimal,
                                         ByVal dIPI As Decimal) As Decimal

        Dim drFatorImposto As DataRow()
        Dim dValorIcms As Decimal ' Valor do item acrescido do calculo de ICMS
        Dim dValorFinal As Decimal ' Valor do item com ICMS e IPI

        Try

            Select Case iModalidadeVenda
                Case eModalidadeVenda.CONSUMO_PROPRIO
                    If dValorIcms < 100 Then
                        dValorIcms = dValorItem / (100 - dValorIcms)
                    Else
                        Throw New Exception("Valor do imposto não pôde ser calculado. " &
                                             Environment.NewLine &
                                             "Verifique o valor de ICMS.")
                    End If

                    drFatorImposto = Me.datFator.Select("ICMS=" & dICMS & " AND IPI=" & dIPI)

                    If drFatorImposto.Length = 1 Then
                        dValorFinal = Conversao.ToDecimal(drFatorImposto(0).Item("fator")) * dValorIcms
                    Else
                        Throw New Exception("Valor do imposto não pôde ser calculado. " &
                                             Environment.NewLine &
                                             "Fator de cálculo não identificado.")
                    End If

                Case eModalidadeVenda.INDUSTRIALIZACAO
                    dValorIcms = 0
                    dValorFinal = dValorIcms
            End Select

            Return dValorFinal

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao calcular o valor do imposto. " & _
                                    Environment.NewLine & ex.Message)


        End Try
    End Function

    Public Function retornarICMSCliente(ByVal sCodCliente As String) As Decimal
        Try

            Return Me.objImposto.retornaICMSCliente(sCodCliente)

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao retornar ICMS Cliente. " & _
                                    Environment.NewLine & ex.Message)


        End Try
    End Function

    Public Function calcularImposto(ByVal dValorTotal As Decimal,
                                    ByVal dFormas As Decimal,
                                    ByVal dICMS As Decimal) As Decimal
        Dim dValorCalculo As Decimal
        Dim dPercPISCOFINS As Decimal

        Try
            dICMS = dICMS / 100
            dICMS = (1 - dICMS)
            dPercPISCOFINS = PIS_COFINS / 100
            dValorCalculo = (dValorTotal + dFormas)

            Return dValorCalculo / dICMS * dPercPISCOFINS

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao calcular o valor do imposto. " & _
                                    Environment.NewLine & ex.Message)


        End Try
    End Function

    Public Function retornarAjusteImposto(ByVal dICMS As Decimal) As Decimal
        Dim dICMSPercentual As Decimal
        Dim dPisCofinsPercentual As Decimal
        Dim dDivisor As Decimal

        Try
            dICMSPercentual = dICMS / 100
            dPisCofinsPercentual = PIS_COFINS / 100

            dDivisor = 1 / (1 - (dICMSPercentual + dPisCofinsPercentual)) * (1 - dICMSPercentual)
            dDivisor = Decimal.Round(dDivisor, 7)
            Return dDivisor

        Catch ex As Exception

            Throw New Exception("Ocorreu um erro ao retornar o valor de ajuste. " & _
                                    Environment.NewLine & ex.Message)


        End Try
    End Function

End Class
